package com.java.common.utils;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.java.common.lang.domain.AjaxResult;
import com.java.common.lang.domain.page.Page;
import com.java.common.lang.domain.page.PageDomain;
import com.java.common.lang.domain.page.PageFunction;
import com.java.common.lang.domain.page.TableDataInfo;
import com.java.common.lang.domain.page.TableSupport;
import com.java.common.lang.exception.BaseException;
import com.java.common.utils.html.HtmlKit;
import com.java.common.utils.sql.SqlUtil;
import io.silks.plugin.oss.OssKit;
import io.silks.plugin.oss.OssService;

/**
 * web层通用数据处理
 * 
 * @author Administrator
 */
public class WebKit {

    /**
     * 分页每页数量最大值
     */
    private static final int MAX_PAGE_SIZE = 50;

    private WebKit() {
    }

    /**
     * 设置请求分页数据<br>
     * 调用startPage后，必须紧跟SQL查询操作
     */
    public static void startPage(boolean forcedPaging) {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        boolean isIllegalPageParams = pageNum == null || pageSize == null || pageNum <= 0 || pageSize <= 0;
        if (isIllegalPageParams) {
            if (!forcedPaging) {
                return;
            }
            throw new BaseException("分页参数有误");
        }
        if (pageSize > MAX_PAGE_SIZE) {
            pageSize = MAX_PAGE_SIZE;
        }
        String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
        PageHelper.startPage(pageNum, pageSize, orderBy);
    }

    public static void startPage() {
        startPage(true);
    }

    /**
     * 构造分页响应数据（仅后台接口可用）
     * 
     * @author yilabao
     * @date 2021年2月2日
     * @param <T>
     * @param list
     * @return TableDataInfo
     */
    public static <T> TableDataInfo getDataTable(List<T> list) {
        TableDataInfo tableResult = new TableDataInfo();
        PageInfo<T> pageInfo = new PageInfo<T>(list);
        Long total = pageInfo.getTotal();
        tableResult.getTableResult(list, total.intValue());
        return tableResult;
    }

    /**
     * 构造分页响应数据
     * 
     * @author yilabao
     * @date 2021年2月26日
     * @param <T>
     * @param list
     * @return Page<T>
     */
    public static <T> Page<T> getPageData(List<T> list) {
        PageInfo<T> pageInfo = new PageInfo<T>(list);
        Page<T> page = new Page<T>();
        page.setList(pageInfo.getList());
        page.setPageNum(pageInfo.getPageNum());
        page.setPageSize(pageInfo.getPageSize());
        page.setTotalPage(pageInfo.getPages());
        page.setTotalRow(pageInfo.getTotal());
        return page;
    }

    /**
     * 新版分页（3合1）
     * 
     * @author yilabao
     * @date 2021年4月30日
     * @param <T>
     * @param p
     * @return Page<T>
     */
    public static <T> Page<T> getPageData(PageFunction<T> p) {
        WebKit.startPage();
        List<T> list = p.list();
        return getPageData(list);
    }

    /**
     * 响应返回结果
     * 
     * @param rows 影响行数
     * @return 操作结果
     */
    public static AjaxResult toAjax(int rows) {
        return rows > 0 ? AjaxResult.success() : AjaxResult.error();
    }

    /**
     * 页面跳转
     */
    public static String redirect(String url) {
        return StringUtils.format("redirect:{}", url);
    }

    /**
     * 获取完整的请求路径，包括：域名，端口，上下文访问路径
     * 
     * @author yilabao
     * @date 2021年3月2日
     * @return String
     */
    public static String getBasePath() {
        return ServletUtils.getBasePath();
    }

    /**
     * 获取文件HTTP全路径
     * 
     * @author yilabao
     * @date 2021年3月2日
     * @param path
     * @return String
     */
    public static String getHttpFullPath(String path) {
        return HtmlKit.getFileHttpAllPath(path, getFileBasePath());
    }

    /**
     * 获取文件的basePath
     * 
     * @author yilabao
     * @date 2021年8月18日
     * @return String
     */
    public static String getFileBasePath() {
        return isOssEnabled() ? OssKit.getBasePath() : getBasePath();
    }

    /**
     * 是否启用OSS
     * 
     * @author yilabao
     * @date 2021年8月19日
     * @return boolean
     */
    public static boolean isOssEnabled() {
        return OssKit.isAvailable();
    }

    /**
     * 获取OSS服务
     * 
     * @author yilabao
     * @date 2021年8月19日
     * @return OssService
     */
    public static OssService getOssService() {
        return OssKit.getOssService();
    }

    /**
     * 获取当前请求全路径
     * 
     * @author yilabao
     * @date 2021年6月3日
     * @param request
     * @return String
     */
    public static String getLocation(HttpServletRequest request) {
        StringBuffer location = request.getRequestURL();
        String queryString = request.getQueryString();
        if (StringUtils.isNotBlank(queryString)) {
            location.append("?").append(queryString);
        }
        return location.toString();
    }

    public static String getLocation() {
        return getLocation(ServletUtils.getRequest());
    }

}